/********************  泛型 *********************/
// 当我们调用函数|接口|类的时候， 可以传递类型给使用， 这个叫做泛型
// 泛型就是动态的类型 不是写死的


function fn<T>(args: T): T {
	return args
}

const f = fn<number>(1)

const f1 = fn<string>('123')

const f2 = fn<boolean>(true)


/********************  使用泛型变量 *********************/

// function f<T>(args: T[]): T[] {
// 	console.log(args.length)
// 	return args
// }

// const s = f<string | number>(['a', 'b', 'c', 'd', 123])

/********************  泛型类型 *********************/

// function f<T>(args: T): T {
// 	return args
// }

// // 泛型 作为 类型
// let s: <U>(args: U) => U
// s = f

// class Person<T, U> {
// 	name: T
// 	age: U
// 	constructor(name: T, age: U) {
// 		this.name = name
// 		this.age = age
// 	}
// }
// const p1 = new Person<string, number>('哈哈', 123)
// const p2 = new Person<boolean, Date>(true, new Date())
// console.log(p1);
// console.log(p2);

// interface MyArray<T> {
// 	[propName: number]: T
// }

// const p: MyArray<number | boolean | string> = [1, 2, 3, 4, 5, true, '123']




